package com.ms3ds.mineInfo.service.impl;

import java.util.*;

import com.ms3ds.common.core.utils.DateUtils;
import com.ms3ds.common.security.utils.SecurityUtils;
import com.ms3ds.mineInfo.api.domain.Team;
import com.ms3ds.mineInfo.mapper.TeamMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ms3ds.mineInfo.mapper.TaskMapper;
import com.ms3ds.mineInfo.api.domain.Task;
import com.ms3ds.mineInfo.service.ITaskService;

/**
 * 开采任务Service业务层处理
 * 
 * @author zlw
 * @date 2025-09-19
 */
@Service
public class TaskServiceImpl implements ITaskService 
{
    @Autowired
    private TaskMapper taskMapper;
    @Autowired
    private TeamMapper teamMapper;

    /**
     * 查询开采任务
     * 
     * @param id 开采任务主键
     * @return 开采任务
     */
    @Override
    public Task selectTaskById(Long id)
    {
        return taskMapper.selectTaskById(id);
    }

    @Override
    public Map<String,List<Float>> getSystemPreviewTask(Long mineId) {
        Map<String,List<Float>> map = new HashMap<>();
        //先获取当前矿山下所有的生产队信息
        Team searchTeam = new Team();
        searchTeam.setMineId(mineId);
        List<Team> teams = teamMapper.selectTeamList(searchTeam);
        for(Team team : teams){
            //获取该生产队下的月度计划
            Task searchTask = new Task();
            searchTask.setTeamId(team.getId());
            searchTask.setTaskType(3L);//月度任务
            List<Task> tasks = taskMapper.selectTaskList(searchTask);
            //如果设置了月度计划
            if(tasks!=null&& !tasks.isEmpty()){
                for(Task task : tasks){
                    Date startTime = task.getStartTime();
                    //获取月数据
                    int month = DateUtils.getMonthFromDate(startTime);
                    if(!map.containsKey(month + "月")){//如果不包含月数据，则添加数据
                        List<Float> miningRecord = new ArrayList<>();
                        miningRecord.add(task.getPlanMining());//设置计划开采量
                        miningRecord.add(task.getRealMining());//设置实际开采量
                        map.put(month + "月",miningRecord);
                    } else{//否则更新数据
                        List<Float> miningRecord = map.get(month + "月");
                        miningRecord.set(0,task.getPlanMining() + miningRecord.get(0));
                        miningRecord.set(1,task.getRealMining() + miningRecord.get(1));
                        map.put(month + "月",miningRecord);
                    }
                }
            } else{//如果没有设置月度计划
                //先空着
            }
        }
        return monthMapSort(map,true);
    }

    /**
     * 按中文月份 key 排序（1月~12月）
     * @param map key形如"1月"…"12月"，value是List<Float>
     * @param asc true升序，false降序
     * @return 排序后的Map（实际类型LinkedHashMap，保证顺序）
     */
    Map<String,List<Float>> monthMapSort(Map<String,List<Float>> map,Boolean asc){
        List<Map.Entry<String, List<Float>>> list = new ArrayList<>(map.entrySet());

        Comparator<Map.Entry<String, List<Float>>> cmp = (o1, o2) -> {
            int m1 = Integer.parseInt(o1.getKey().replaceAll("\\D+", ""));
            int m2 = Integer.parseInt(o2.getKey().replaceAll("\\D+", ""));
            return asc ? (m1 - m2) : (m2 - m1);
        };
        list.sort(cmp);

        Map<String, List<Float>> result = new LinkedHashMap<>(); // 有序
        for (Map.Entry<String, List<Float>> e : list) {
            result.put(e.getKey(), e.getValue());
        }
        return result;
    }

    /**
     * 查询开采任务列表
     * 
     * @param task 开采任务
     * @return 开采任务
     */
    @Override
    public List<Task> selectTaskList(Task task)
    {
        return taskMapper.selectTaskList(task);
    }

    /**
     * 新增开采任务
     * 
     * @param task 开采任务
     * @return 结果
     */
    @Override
    public int insertTask(Task task)
    {
        Long userId = SecurityUtils.getUserId();
        task.setCreateBy(String.valueOf(userId));
        task.setCreateTime(DateUtils.getNowDate());
        return taskMapper.insertTask(task);
    }

    /**
     * 修改开采任务
     * 
     * @param task 开采任务
     * @return 结果
     */
    @Override
    public int updateTask(Task task)
    {
        Long userId = SecurityUtils.getUserId();
        task.setUpdateBy(String.valueOf(userId));
        task.setUpdateTime(DateUtils.getNowDate());
        return taskMapper.updateTask(task);
    }

    /**
     * 批量删除开采任务
     * 
     * @param ids 需要删除的开采任务主键
     * @return 结果
     */
    @Override
    public int deleteTaskByIds(Long[] ids)
    {
        return taskMapper.deleteTaskByIds(ids);
    }

    /**
     * 删除开采任务信息
     * 
     * @param id 开采任务主键
     * @return 结果
     */
    @Override
    public int deleteTaskById(Long id)
    {
        return taskMapper.deleteTaskById(id);
    }


}
